package com.jimmy.medical.wechat;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

@Component
public class WeChatUrlHelper {

	@Autowired
	WeChatPayConfig weChatPayConfig;

	/**
	 * 获取用户授权 URL(弹出授权页面,获取用户所有信息)
	 * @param redirectUrl：授权后重定向的回调链接地址，请使用urlencode对链接进行处理
	 * */
	public String getFullAuthorizeUrl(String redirectUrl){
		return getAuthorizeUrl(redirectUrl, "snsapi_userinfo", "success");
	}
	
	/**
	 * 获取用户授权 URL（不弹出授权页面，直接跳转，只能获取用户openid）
	 * @param redirectUrl：授权后重定向的回调链接地址，请使用urlencode对链接进行处理
	 * */
	public String getOpenIdAuthorizeUrl(String redirectUrl){
		return getAuthorizeUrl(redirectUrl, "snsapi_base", "success");
	}

	/**
	 * 获取用户授权 URL
	 * @param redirectUrl：授权后重定向的回调链接地址，请使用urlencode对链接进行处理
	 * @param scope：应用授权作用域
				nsapi_base （不弹出授权页面，直接跳转，只能获取用户openid）
				snsapi_userinfo （弹出授权页面，可通过openid拿到昵称、性别、所在地。并且，即使在未关注的情况下，只要用户授权，也能获取其信息）
	 * */
	public String getAuthorizeUrl(String redirectUrl,String scope){
		return getAuthorizeUrl(redirectUrl, scope, "success");
	}
	
	/**
	 * 获取用户授权 URL
	 * 格式：https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE
	 * appid：公众号的唯一标识
	 * @param redrectUrl：授权后重定向的回调链接地址，请使用urlencode对链接进行处理
//	 * @param response_type：返回类型，请填写code
	 * @param scope：应用授权作用域
				nsapi_base （不弹出授权页面，直接跳转，只能获取用户openid）
				snsapi_userinfo （弹出授权页面，可通过openid拿到昵称、性别、所在地。并且，即使在未关注的情况下，只要用户授权，也能获取其信息）
	 * @param state：重定向后会带上state参数，开发者可以填写a-zA-Z0-9的参数值，最多128字节
	 * #wechat_redirect ：无论直接打开还是做页面302重定向时候，必须带此参数
	 * */
	public String getAuthorizeUrl(String redrectUrl,String scope,String state){
		//重定向URL
		try {
			String redrectUrlFull = java.net.URLEncoder.encode(weChatPayConfig.REDIRECT_URI_HOME+redrectUrl, "GBK");
			//组装授权URL
			StringBuffer url = new StringBuffer(weChatPayConfig.OPEN_URL_BASE)
			.append("/connect/oauth2/authorize?appid=").append(weChatPayConfig.APPID)
			.append("&redirect_uri=").append(redrectUrlFull)
			.append("&response_type=").append("code")
			.append("&scope=").append(scope)
			.append("&state=").append(state)
			.append("#wechat_redirect");
			return url.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 通过code换取网页授权access_token URL
	 * https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
	 * */
	public String getUserAccessTokenUrl(String code){
		//空授权代码直接返回空地址
		if(code == null || StringUtils.isEmpty(code)){
			return null;
		}
		//组装授权URL
		StringBuffer url = new StringBuffer(weChatPayConfig.API_URL_BASE)
		.append("/sns/oauth2/access_token?appid=").append(weChatPayConfig.APPID)
		.append("&secret=").append(weChatPayConfig.APPSECRET)
		.append("&code=").append(code)
		.append("&grant_type=authorization_code");
		return url.toString();
	}

	/**
	 * 当access_token超时后，可以使用refresh_token进行刷新，refresh_token有效期为30天
	 * https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN 
	 * */
	public String getRefreshAccessTokenUrl(String refreshToken){
		//空授权代码直接返回空地址
		if(refreshToken == null || StringUtils.isEmpty(refreshToken)){
			return null;
		}
		//组装授权URL
		StringBuffer url = new StringBuffer(weChatPayConfig.API_URL_BASE)
		.append("/sns/oauth2/access_token?appid=").append(weChatPayConfig.APPID)
		.append("&grant_type=").append("refresh_token")
		.append("&refresh_token=").append(refreshToken);
		return url.toString();
	}
	
	/**
	 * 获取用户信息URL
	 * https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
	 * */
	public String getUserInfoUrl(String accessToken,String openId){
		//空授权代码直接返回空地址
		if(accessToken == null || StringUtils.isEmpty(accessToken) || openId == null || StringUtils.isEmpty(openId)){
			return null;
		}
		//组装授权URL
		StringBuffer url = new StringBuffer(weChatPayConfig.API_URL_BASE)
		.append("/sns/userinfo?access_token=").append(accessToken)
		.append("&&openid=").append(openId)
		.append("&lang=zh_CN");
		return url.toString();
	}

	/**
	 * 检验用户授权凭证（access_token）是否有效
	 * https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
	 * */
	public String getCheckUserAccessTokenUrl(String accessToken,String openId){
		//空授权代码直接返回空地址
		if(accessToken == null || StringUtils.isEmpty(accessToken) || openId == null || StringUtils.isEmpty(openId)){
			return null;
		}
		//组装授权URL
		StringBuffer url = new StringBuffer(weChatPayConfig.API_URL_BASE)
		.append("/sns/auth?access_token=").append(accessToken)
		.append("&&openid=").append(openId);
		return url.toString();
	}

	/**
	 * 获取JS TICKET URL
	 * @param accessToken
	 * */
	public String getJSTicketUrl(String accessToken){
		//空授权代码直接返回空地址
		if(accessToken == null || StringUtils.isEmpty(accessToken)){
			return null;
		}
		StringBuffer url = new StringBuffer(weChatPayConfig.API_URL_JSAPITICKET).append(accessToken);
		return url.toString();
	}
}
